home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / comm / misc / zvm1_19.lha / handlesilentanswer.zvm < prev    next >
Text File  |  1993-04-24  |  8KB  |  301 lines

  1. /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */
  2. /* DO NOT EDIT ANYTHING THAT IS NOT PART OF THE USER-CODE SECTION!!! */
  3. /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
  4.  
  5. /* Called when zvm wants to handle a silent answer call */
  6. /* You can assume that zvm will answer the telephone for you
  7.     it will hang up for you after you're done.  You do
  8.     need to tell it to listen.  If, at any time, you would
  9.     like to handle a fax, do something like call answerFax() */
  10.  
  11. /* we want results! */
  12. options results
  13.  
  14. /* We want to trap on these things, to help us debug */
  15. signal on halt
  16. signal on novalue
  17. signal on syntax
  18. signal on break_c
  19.  
  20. /* Set up modem stuff */
  21. call doInitializations
  22.  
  23. /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */
  24. /*                       BEGIN USER-CODE SECTION                        */
  25.  
  26. call playBeep(3000, 0, 1) /* tell person who answered that ZVM also picked
  27.                 up the line */
  28. status = waitForKeyPress()
  29. if (status = status.faxDetected) then call answerFax()
  30.  
  31. call playBeep(3000, 0, 1) /* tell person who answered that ZVM just hung
  32.                 up */
  33. call listen()
  34. exit 20
  35.  
  36. waitForKeyPress: procedure expose status.
  37.     status = read1Key(30); /* 30 seconds */
  38.     if status = status.faxDetected then return status
  39.     if status ~= status.normal then return status
  40.  
  41.     if (key = '2') then return status.faxDetected
  42.  
  43.     return status.normal
  44.  
  45.  
  46. /*                         END OF USER-CODE SECTION                       */
  47. /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
  48.  
  49. /*             THIS IS INCLUDED FROM INCLUDE.ZVM                          */
  50. /*-------------------------HANDS OFF--------------------------------------*/
  51. /* DON'T TOUCH THIS STUFF.  IF YOU FIX SOMETHING HERE, TELL ME ABOUT IT   */
  52.  
  53. /* This function gives you a simple way of presenting an N key menu
  54.     to the caller
  55.  
  56.     ARGS:  numKeys choiceFileName badChoiceFileName timeOut validChoices
  57.     numBadChoices
  58.  
  59.     numKeys = number of keys wanted
  60.     choiceFileName = file name of the menu
  61.     badChoiceFileName = what to say if caller enters a bad choice
  62.     timeOut = number of seconds allowed before timing out
  63.     validChoices = list of characters that are valid choices
  64.     numBadChoices = number of times you want to present the menu before exiting
  65.  
  66.     RETURNS:  status, choice = valid key
  67. */
  68.  
  69. presentMenu: procedure expose choice status. mode.
  70.     parse arg numKeys,choiceFileName,badChoiceFileName,timeOut,validChoices,numBadChoices .
  71.  
  72.     timesAround = numBadChoices;
  73.  
  74.     do timesAround = numBadChoices to 1 by -1
  75.         status = playVoice(choiceFileName)
  76.  
  77.         if status > status.keyDetected then signal presentMenuDone;
  78.  
  79.         status = readNKeys(numKeys, timeOut)
  80.  
  81.         if status = status.timedOut then do
  82.             call flushPhoneBuffer()
  83.             status = playVoice('voice:voices/Timed Out')
  84.             iterate
  85.         end
  86.         if status ~= status.normal then signal presentMenuDone;
  87.  
  88.         choice = keys
  89.         if pos(choice, validChoices) = 0 then do
  90.             call flushPhoneBuffer()
  91.             status = playVoice(badChoiceFileName)
  92.             iterate
  93.         end
  94.  
  95.         return status.normal
  96.     end
  97.  
  98.     status = status.timedOut
  99. presentMenuDone:
  100.     return status
  101.  
  102. /*----------------------------------------------------------------------*/
  103. /*    Here are the encapsulated functions.  They're responsible for
  104.     communicating with ZVM.  Don't edit or touch them, except for
  105.     bug fixes.
  106. */
  107.  
  108. playVoice:  procedure expose status. mode.
  109.     parse arg fileName
  110.     address voicemail1 'playVoice' fileName
  111.     return rc
  112.  
  113. addLogEntry: procedure expose status. mode.
  114.     parse arg fileName, actualTime, duration
  115.     address voicemail1 'addLogEntry' fileName ',' actualTime ',' duration
  116.     return rc
  117.  
  118. setLogEntryStatus: procedure expose status. mode.
  119.     parse arg logEntryNumber, logEntryStatus
  120.     select
  121.         when logEntryStatus = ' ' then ls = 0
  122.         when logEntryStatus = 'a' then ls = 1
  123.         when logEntryStatus = 'd' then ls = 2
  124.         otherwise ls = -1
  125.     end
  126.     address voicemail1 'setLogEntryStatus' logEntryNumber ',' ls
  127.     return rc
  128.  
  129. getLogEntryData: procedure expose status. mode.
  130.     parse arg logEntryNumber
  131.     address voicemail1 'getLogEntryData' logEntryNumber
  132.     return result
  133.  
  134. getLogEntryFileName: procedure expose status. mode.
  135.     parse arg logEntryNumber
  136.     address voicemail1 'getLogEntryFileName' logEntryNumber
  137.     return result
  138.  
  139. getNumVoiceMessages: procedure expose status. mode.
  140.     address voicemail1 'getNumVoiceMessages'
  141.     return result
  142.  
  143. recordVoice:  procedure expose status. mode.
  144.     parse arg fileName
  145.     address voicemail1 'recordVoice' fileName
  146.     return rc
  147.  
  148. password: procedure expose status. mode.
  149.     address voicemail1 'password'
  150.     return result
  151.  
  152. hasFax: procedure expose status. mode.
  153.     address voicemail1 'hasfax'
  154.     return result
  155.  
  156. playBeep:  procedure expose status. mode.
  157.     parse arg tone1, tone2, duration
  158.     address voicemail1 'playBeep' tone1 ',' tone2 ',' duration
  159.     return rc
  160.  
  161. readNKeys:  procedure expose status. keys mode.
  162.     parse arg numKeys, timeOut
  163.     address voicemail1 'readNKeys' numKeys ',' timeOut
  164.     if rc = status.normal then keys = result
  165.     return rc
  166.  
  167. read1Key:  procedure expose status. key mode.
  168.     parse arg timeOut
  169.     address voicemail1 'read1Key' timeOut
  170.     if rc = status.normal then key = result
  171.     return rc
  172.  
  173. readKeysUntil: procedure expose status. keys mode.
  174.     parse arg terminatingCharacter, maxCharacters, timeOut
  175.     address voicemail1 'readKeysUntil' terminatingCharacter ',' maxCharacters ',' timeOut
  176.     if rc = status.normal then keys = result
  177.     return rc
  178.  
  179. readLine: procedure expose status. line mode.
  180.     parse arg timeOut
  181.     address voicemail1 'readLine' timeOut
  182.     if rc = status.normal then line = result
  183.     return rc
  184.  
  185. writeLine: procedure expose status. mode.
  186.     parse arg line
  187.     address voicemail1 'writeLine' line
  188.     return rc
  189.  
  190. /* the 'assumeUnknownMode' is to make sure that any use of a voice command WILL
  191.     cause ZVM to hang up the line, reset the modem, then do its stuff */
  192.  
  193. dropLine: procedure expose status. mode.
  194.     address voicemail1 'assumeUnknownMode'
  195.     address voicemail1 'requireMode' mode.commandMode
  196.     return rc
  197.  
  198. atCommands: procedure expose status. mode.
  199.     address voicemail1 'assumeUnknownMode'
  200.     address voicemail1 'requireMode' mode.connectedMode
  201.     return rc
  202.  
  203. use19200: procedure expose status. mode.
  204.     address voicemail1 'setserial'
  205.     return rc
  206.  
  207. flushPhoneBuffer:  procedure expose status. mode.
  208.     address voicemail1 'flushPhoneBuffer'
  209.     return status.normal
  210.  
  211. listen: procedure expose status. mode.
  212.     address voicemail1 'listen'
  213.     return status.normal
  214.  
  215. answerFax: procedure expose status. mode.
  216.     address voicemail1 'answerFax'
  217.     return rc
  218.  
  219. cTime: procedure expose status. now mode.
  220.     address voicemail1 'ctime'
  221.     return result
  222.  
  223. displayError: procedure expose status. mode.
  224.     parse arg error
  225.     address voicemail1 'displayError' error
  226.     return status.normal
  227.  
  228. displayStatus: procedure expose status. mode.
  229.     parse arg status
  230.     address voicemail1 'displayStatus' status
  231.     return status.normal
  232.  
  233. /* Effectively unlistens also! */
  234. setLastError: procedure expose status. mode.
  235.     parse arg status, error
  236.     address voicemail1 'setLastError' status ',' error
  237.  
  238. /*-----------------------------------------------------------------------*/
  239. /* signal processing */
  240. error:
  241.     say "Error " rc " at line " sigl
  242.     call listen()
  243.     exit 20
  244.  
  245. break_c:
  246. halt:
  247.     say "VoiceMail was stopped manually"
  248.     call listen()
  249.     exit 20
  250.  
  251.  
  252. novalue:
  253.     say "No Value at Line" sigl
  254.     call playVoice('voice:voices/NoValue')
  255.     call listen()
  256.     exit 20
  257.  
  258. syntax:
  259.     say 'Syntax Error at Line' sigl
  260.     call playVoice('voice:voices/SyntaxError')
  261.     call listen()
  262.     exit 20
  263.  
  264.  
  265. /* Initialize everything needed to communicate correctly with ZVM */
  266. doInitializations: procedure expose compression. mode. status. device.
  267.  
  268. /* compressions */
  269. compression.ADPCM2 = 2
  270. compression.ADPCM3 = 3
  271. compression.CELP = 1
  272.  
  273. /* devices */
  274. device.telephoneLine = 2
  275. device.externalMic = 8
  276. device.internalSpeaker = 16
  277.  
  278. /* modem modes */
  279. mode.unknownMode = -1
  280. mode.commandMode = 0
  281. mode.voiceMode = 1
  282. mode.connectedMode = 2
  283. mode.playMode = 3
  284. mode.recordMode = 4
  285.  
  286. /* return statuses from the various commands */
  287. status.normal = 0
  288. status.keyDetected = 1
  289. status.quietDetected = 2
  290. status.silenceDetected = 3
  291. status.faxDetected = 4
  292. status.busyDetected = 5
  293. status.timedOut = 6
  294. status.signalDetected = 7
  295. status.overflow = 8
  296. status.error = 9
  297.  
  298. return
  299.  
  300.  
  301.